﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BBMS.DLL.Base;
/*
 DO NOT ADD or MODIFY ANY CODE HERE
 */
namespace BBMS.DLL.Forms.Base
{
    public partial class FrmEditBase : Form
    {
        public  static readonly string FunctionKey = "FrmEditBase";
        protected virtual string GetFunctionKey() { return "FrmEditBase"; }
        protected ObjectBase curObj;
        public event UpdatedObject OnUpdatedObject;
        public event AddedNewObject OnAddedNewObject;

        public FrmEditBase(ObjectBase obj)
        {
            InitializeComponent();
            this.Font = SystemFonts.MessageBoxFont;
            curObj = obj;
        }

        public FrmEditBase()
        {
            InitializeComponent();
            curObj = null;
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Escape:
                    OnClose();
                    return true;
                case Keys.Enter:
                    if (!(this.ActiveControl is Button))
                    {
                        SendKeys.Send("{TAB}");
                        return true;
                    }
                    break;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        // Khi form load lên
        // 1> Check quyền min == đọc
        // 2> Nếu có >= quyền đọc && curObject != null: OnLoad()
        // 3> Nếu có quyền <= quyền đọc && curObject == null: Đóng form
        private void FrmEditBase_Load(object sender, EventArgs e)
        {
            CheckRoles();
            OnLoad();
        }

        /* Hàm kiểm tra Roles của người dùng*/
        protected virtual void CheckRoles() { }

        /* Hàm load dữ liệu curObject vào các edit field */
        protected virtual void OnLoad() { }

        /* Hàm xử lý sự kiện Lưu/Thêm mới */
        protected virtual void OnSaveAndNew() { SaveObject(false);  }

        /* Hàm xử lý sự kiện Lưu/Đóng*/
        protected virtual void OnSaveAndClose() { SaveObject(true); }

        /* Hàm xử lý sự kiện Đóng*/
        protected virtual void OnClose() 
        {
            this.DialogResult = DialogResult.Cancel;
        }
        
        /* Hàm xử lý sự kiện Nhập lại/ Clear All 
         * Tại các lớp thừa kế con, xử lý xóa dữ liệu về "" cho các edit field 
         * hoặc load lại dữ liệu nếu curObject != null 
         */
        protected virtual void Reset() { }
        
        protected virtual ObjectBase GetEditedObject(){ return null; }
        
        protected virtual void SaveObject(bool close)
        {
            ObjectBase obj = GetEditedObject();
            if (obj != null)
            {
                String msg = "";
                if (curObj == null)
                    msg = obj.InsertNew();
                else
                    msg = obj.Save();

                if (msg.Length == 0)
                {
                    if (curObj == null)
                    {
                        if(OnAddedNewObject!=null) this.OnAddedNewObject(obj);
                        SystemHelper.DialogInfo("Thêm mới thành công.");
                    }
                    if (curObj != null )
                    {
                        if(OnUpdatedObject != null) this.OnUpdatedObject(obj);
                        SystemHelper.DialogInfo("Cập nhật thành công");
                    }
                    curObj = obj;
                    if (close)
                    { // Luu & Dong ?
                        this.DialogResult = DialogResult.OK;
                    }
                    else { // Luu va them moi
                        curObj = null; // gan curObject = null => trang thai la them moi
                        Reset(); 
                    }
                }
                else MessageBox.Show(msg);
            }
        }
    }
}
